import axios from 'axios';
import Cookies from 'js-cookie';
import { message } from 'antd';

export const MethodType = {
  GET: 'GET',
  POST: 'POST',
  PUT: 'PUT',
  DELETE: 'DELETE',
  HEAD: 'HEAD',
};

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

let baseURL = '';
// BUILD_ENV 变量已经在上文定义过了
switch (BUILD_ENV) {
  case 'dev':
    baseURL = 'https://apib.wozp.cn/'; // 开发
    break;
  case 'test':
    baseURL = 'https://apib.wozp.cn/'; //测试
    break;
  case 'pre':
    baseURL = 'https://apibgray.wozp.cn/'; // 灰度预发
    break;
  case 'pro':
    baseURL = `https://apib.wozhipei.com`; //正式
    break;
  default:
    baseURL = 'https://apib.wozp.cn/'; // 开发
    break;
}

/**
 * 请求
 * @param url 请求地址
 * @param method 请求方式
 * @param params 入参
 * @param header 请求头
 * @returns {Promise<AxiosResponse>}
 */
const baseRequest = (
  url,
  method = MethodType.GET,
  params = {},
  header = {},
) => {
  const data = method == 'GET' ? 'params' : 'data';
  // let token = Cookies.get('token');
  let token = 'kdOYQs5bhcxbdnE5OHT3OERIS9_YDGHQ-1614139251';
  if (token !== undefined && token !== '' && token !== null) {
    header.Authorization = 'Bearer ' + token;
  }
  const request = axios({
    baseURL,
    method,
    url,
    [data]: params,
    headers: {
      'Content-Type': 'application/json',
      ...header,
    },
  });
  return request;
};

/**
 * head请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns {Promise<AxiosResponse>}
 */
export const headData = (url, params = {}) => {
  return baseRequest(url, MethodType.HEAD, params);
};

/**
 * get请求
 * @param url 请求地址
 * @param params 请求参数
 * @returns {Promise<AxiosResponse>}
 */
export const getData = (url, params = {}) => {
  return baseRequest(url, MethodType.GET, params);
};

/**
 * post请求
 * @param url 请求地址
 * @param params 请求地址
 * @returns {Promise<AxiosResponse>}
 */
export const postData = (url, params = {}) => {
  return baseRequest(url, MethodType.POST, params);
};

/**
 * put请求
 * @param url 请求地址
 * @param params 请求地址
 * @returns {Promise<AxiosResponse>}
 */
export const putData = (url, params = {}) => {
  return baseRequest(url, MethodType.PUT, params);
};

/**
 * delete请求
 * @param url 请求地址
 * @param params 请求地址
 * @returns {Promise<AxiosResponse>}
 */
export const deleteData = (url, params = {}) => {
  return baseRequest(url, MethodType.DELETE, params);
};

/**
 * 上传文件请求
 * @param url 请求地址
 * @param param 表单数据{Object}内部必须file键值对
 * @returns {Promise<AxiosResponse>}
 */
export const postFile = (url, param = {}) => {
  let fileData = new FormData();
  for (let key in param) {
    fileData.append(key, param[key]);
  }
  //通过append向form对象添加数据
  return baseRequest(url, MethodType.POST, fileData, {
    'Content-Type': 'multipart/form-data',
  });
};

// 添加请求拦截器
axios.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    console.log('===============在发送请求之前做些什么=======================');
    return config;
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  },
);

// 添加响应拦截器
axios.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    console.log('===============对响应数据做点什么=======================');
    if (response.status >= 200 && response.status < 300) {
      return Promise.resolve(response);
    } else {
      // return response;
      const data = response.data;
      message.error(data.message);
    }
  },
  function(error) {
    //响应错误处理
    let { data, status } = error.response || {};
    if (data && data.message) {
      message.error(data.message);
    }
    // return Promise.reject(error);
  },
);
